//
//  DR_RemoteManager.swift
//  DocReaderRP
//
//  Created by  mac on 2025/11/19.
//

import Foundation
import FirebaseRemoteConfig

// MARK: - 远程配置管理器
class DR_RemoteManager {
    
    static let shared = DR_RemoteManager()
    
    // 全局广告配置模型
    var adConfigModel: DR_AdConfigModel?
    
    private let remoteConfig = RemoteConfig.remoteConfig()
    
    private init() {
        setupRemoteConfig()
    }
    
    // MARK: - 设置 Remote Config
    private func setupRemoteConfig() {
        // 设置默认配置（使用本地配置）
        if let defaultConfigData = adConfig_dic.data(using: .utf8),
           let defaultConfig = try? JSONSerialization.jsonObject(with: defaultConfigData, options: []) as? [String: Any] {
            remoteConfig.setDefaults(defaultConfig as? [String: NSObject])
        }
        
        // 设置获取间隔（可选，用于开发测试）
        let settings = RemoteConfigSettings()
        #if DEBUG
        // 开发环境：最小间隔为 0（可以频繁获取）
        settings.minimumFetchInterval = 0
        #else
        // 生产环境：最小间隔为 3600 秒（1小时）
        settings.minimumFetchInterval = 3600
        #endif
        remoteConfig.configSettings = settings
    }
    
    // MARK: - 获取远程配置
    /// 从 Firebase Remote Config 获取配置并解析
    /// - Parameter completion: 完成回调，返回配置模型或错误
    func fetchRemoteConfig(completion: @escaping (Result<DR_AdConfigModel, Error>) -> Void) {
        print("📢 [DR_RemoteManager] 开始从 Firebase Remote Config 获取配置")
        
        remoteConfig.fetch { [weak self] (status, error) in
            guard let self = self else { return }
            
            if let error = error {
                print("❌ [DR_RemoteManager] 获取远程配置失败: \(error.localizedDescription)")
                // 获取失败，使用本地配置
                self.loadLocalConfig(completion: completion)
                return
            }
            
            if status == .success {
                print("✅ [DR_RemoteManager] 远程配置获取成功")
                self.remoteConfig.activate { [weak self] (changed, error) in
                    guard let self = self else { return }
                    
                    if let error = error {
                        print("❌ [DR_RemoteManager] 激活远程配置失败: \(error.localizedDescription)")
                        // 激活失败，使用本地配置
                        self.loadLocalConfig(completion: completion)
                        return
                    }
                    
                    // 获取配置值（base64 加密的字符串）
                    let configValue = self.remoteConfig.configValue(forKey: DR_AdConfigValue.remoteConfigKey.rawValue)
                    
                    if configValue.source == .remote || configValue.source == .default {
                        let base64String = configValue.stringValue ?? ""
                        
                        if base64String.isEmpty {
                            print("⚠️ [DR_RemoteManager] 远程配置值为空，使用本地配置")
                            self.loadLocalConfig(completion: completion)
                            return
                        }
                        
                        // Base64 解密
                        if let decryptedString = self.base64Decode(base64String) {
                            print("✅ [DR_RemoteManager] Base64 解密成功")
                            // 解析配置
                            self.parseConfig(decryptedString, completion: completion)
                        } else {
                            print("❌ [DR_RemoteManager] Base64 解密失败，使用本地配置")
                            self.loadLocalConfig(completion: completion)
                        }
                    } else {
                        print("⚠️ [DR_RemoteManager] 远程配置未激活，使用本地配置")
                        self.loadLocalConfig(completion: completion)
                    }
                }
            } else {
                print("⚠️ [DR_RemoteManager] 远程配置获取状态: \(status.rawValue)，使用本地配置")
                // 获取状态不是成功，使用本地配置
                self.loadLocalConfig(completion: completion)
            }
        }
    }
    
    // MARK: - 加载本地配置
    private func loadLocalConfig(completion: @escaping (Result<DR_AdConfigModel, Error>) -> Void) {
        print("📢 [DR_RemoteManager] 使用本地配置")
        parseConfig(adConfig_dic, completion: completion)
    }
    
    // MARK: - Base64 解密
    private func base64Decode(_ base64String: String) -> String? {
        guard let data = Data(base64Encoded: base64String) else {
            print("❌ [DR_RemoteManager] Base64 字符串解码失败")
            return nil
        }
        
        guard let decodedString = String(data: data, encoding: .utf8) else {
            print("❌ [DR_RemoteManager] Base64 解码后的数据转换为字符串失败")
            return nil
        }
        
        return decodedString
    }
    
    // MARK: - 解析配置
    private func parseConfig(_ configString: String, completion: @escaping (Result<DR_AdConfigModel, Error>) -> Void) {
        guard let data = configString.data(using: .utf8) else {
            let error = NSError(domain: "DR_RemoteManager", code: -1, userInfo: [NSLocalizedDescriptionKey: "配置字符串转换失败"])
            completion(.failure(error))
            return
        }
        
        do {
            let configModel = try JSONDecoder().decode(DR_AdConfigModel.self, from: data)
            self.adConfigModel = configModel
            print("✅ [DR_RemoteManager] 配置解析成功")
            print("   - 用户模型: \(configModel.userModelInt == 1 ? "买量用户" : "普通用户")")
            print("   - 广告类型配置数量: \(configModel.adTypeConfig.count)")
            print("   - 场景配置数量: \(configModel.adSceneConfig.count)")
            completion(.success(configModel))
        } catch {
            print("❌ [DR_RemoteManager] 配置解析失败: \(error.localizedDescription)")
            completion(.failure(error))
        }
    }
}
